/**
 * Copyright (C) 2018-2022
 * All rights reserved, Designed By www.yixiang.co
 * 注意：
 * 本软件为www.yixiang.co开发研制
 */
package co.yixiang.modules.order.order.service;

import co.yixiang.common.service.BaseService;
import co.yixiang.modules.order.cart.entity.dto.TradeDTO;
import co.yixiang.modules.order.order.entity.domain.YxStoreOrder;
import co.yixiang.modules.order.order.entity.dto.*;
import co.yixiang.modules.order.order.entity.vo.OrderDetailVO;
import co.yixiang.modules.order.order.entity.vo.StoreOrderDetailVO;
import co.yixiang.modules.order.order.entity.vo.YxStoreOrderVoF;
import org.omg.PortableInterceptor.INACTIVE;
import org.springframework.data.domain.Pageable;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * @author hupeng
 * @date 2020-05-12
 */
public interface YxStoreOrderService extends BaseService<YxStoreOrder> {

    /**
     * 查询会员自己的订单信息
     * 查询数据分页
     * @param criteria 条件
     * @param pageable 分页参数
     * @return Map<String, Object>
     */
    Map<String, Object> queryAllToVo(YxStoreOrderQueryCriteria criteria, Pageable pageable);


    /**
     * 查询会员自己的订单详情
     * 查询数据分页
     * @param sn 订单号
     * @return Map<String, Object>
     */
    YxStoreOrderVoF queryOrderDetail(String sn);

    /**
     * 查询用户下，不同订单状态的总数
     * @return rder_status,size
     */
    Map<String,Integer> orderStatusSizeBYUid();
    //================================= 后台 ===================================================

    /**
     * 查询数据分页
     * @param criteria 条件
     * @param pageable 分页参数
     * @return Map<String, Object>
     */
    Map<String, Object> queryAll(YxStoreOrderQueryCriteria criteria, Pageable pageable);

    /**
     * 查询所有数据不分页
     * @param criteria 条件参数
     * @return List<YxStoreOrderDto>
     */
    List<YxStoreOrder> queryAll(YxStoreOrderQueryCriteria criteria);

    /** 创建订单 */
    YxStoreOrderDto create(YxStoreOrder resources);


    void update(YxStoreOrder resources);

    void deliverGoods(StoreOrderExpress order);

    /**
     * 导出数据
     * @param all 待导出的数据
     * @param response /
     * @throws IOException /
     */
    void download(List<YxStoreOrderDto> all, HttpServletResponse response) throws IOException;


    Map<String, Object> queryAll(List<String> ids);


    String orderType(Long id, Long pinkId, Long combinationId, Long seckillId,
                     Long bargainId, String deliveryMethod, String orderType);

    void refund(YxStoreOrder resources);

    OrderCountDto getOrderCount();

    OrderTimeDataDto getOrderTimeData();

    Map<String, Object> chartCount();



    /**
     * 根据sn查询
     *
     * @param orderSn 订单编号
     * @return 订单信息
     */
    YxStoreOrder getBySn(String orderSn);
    /** 创建订单 */
    void intoDB(TradeDTO tradeDTO);

    /**
     * 订单付款
     * 修改订单付款信息
     * 记录订单流水
     *
     * @param orderSn       订单编号
     * @param paymentMethod 支付方法
     * @param receivableNo  第三方流水
     */
    void payOrder(String orderSn, String paymentMethod, String receivableNo);



    /**
     * 通过trade 获取订单列表
     *
     * @param tradeSn 交易编号
     * @return 订单列表
     */
    List<YxStoreOrder> getByTradeSn(String tradeSn);

    /**
     * 订单详细
     *
     * @param orderSn 订单SN
     * @return 订单详细
     */
    StoreOrderDetailVO queryDetail(String orderSn);
    /**
     * 取消订单
     *
     * @param orderSn 订单SN
     * @param reason  取消理由
     * @return 订单
     */
    YxStoreOrder cancel(String orderSn, String reason);

    /**
     * 确认收货
     *
     * @param orderSn 订单SN
     * @return 订单
     */
    YxStoreOrder take(String orderSn);


    /**
     * 订单售后
     *
     * @param orderSn 订单SN
     * @param reason  取消理由
     * @return 订单
     */
    YxStoreOrder afterSale(String orderSn, String reason);
}
